package testPackage

//引入包
// import "fmt"  当前模块函数调用 例 ：fmt.Print()
//为fmt 取别名为fmt2   当前模块函数调用 例：fmt2.Print()
import (
	fmt2 "fmt"
)

//全局变量的声明和赋值
//全局变量与局部变量名称可以相同，但是函数内的局部变量会被优先考虑
var name = "test"

//函数
func FirtTestFunc() {

	//这是单行注释

	/*
		这是多行注释
	*/

	//换行输出打印
	fmt2.Println("换行打印测试")

	//输出打印
	fmt2.Print("这是我的第一个测试程序")

	//常量
	const PI = 3.14

	var name = "anqi"

	//一般类型声明
	type newType int

	//结构的声明
	type gopher struct{}

	//接口的声明
	type golang interface{}

	fmt2.Println(name)
	// 一行代表一个结束语   不需要像 java ";"

	//标识符 java

	fmt2.Println(PI)

	//多个相同类型声明可以简写
	var a, b = 1.5, 1

	fmt2.Println(a, b)

	//一般声明
	var available bool

	//简短声明
	valid := true

	//赋值操作
	available = true

	fmt2.Println(available, valid)

	/*
		枚举值
		iota 特殊常量
	*/
	const (
		Unknown = iota
		Female
		Male
	)

	fmt2.Println(Male)

	const (
		q = iota   //0
		w          //1
		e          //2
		r          //3
		t = "haha" //独立值 ,iota += 1
		y          //"haha" ,iota += 1
		u = "100"  //100, iota += 1
		i          //100, iota += 1
		o = iota   //8，恢复计数
		p          //9
	)

	fmt2.Println(q, w, e, r, t, y, u, i, o, p)

	const (
		z = 1 << iota //z左移1位
		x = 3 << iota //x左移2位
		c             //x左移3位
		v             //...
	)

	fmt2.Println(z, x, c, v)

	fmt2.Printf("z 变量类型为 = %T\n", z)
	fmt2.Printf("z 变量的值为 = %d\n", z)

	/*
		运算符
			算术运算符 -->
									假定 A 值为 10，B 值为 20。
									+	相加	A + B 输出结果 30
									-	相减	A - B 输出结果 -10
									*	相乘	A * B 输出结果 200
									/	相除	B / A 输出结果 2
									%	求余	B % A 输出结果 0
									++	自增	A++ 输出结果 11
									--	自减	A-- 输出结果 9
			关系运算符 -->
									假定 A 值为 10，B 值为 20。
									==	检查两个值是否相等，如果相等返回 True 否则返回 False。	(A == B) 为 False
									!=	检查两个值是否不相等，如果不相等返回 True 否则返回 False。	(A != B) 为 True
									>	检查左边值是否大于右边值，如果是返回 True 否则返回 False。	(A > B) 为 False
									<	检查左边值是否小于右边值，如果是返回 True 否则返回 False。	(A < B) 为 True
									>=	检查左边值是否大于等于右边值，如果是返回 True 否则返回 False。	(A >= B) 为 False
									<=	检查左边值是否小于等于右边值，如果是返回 True 否则返回 False。	(A <= B) 为 True
			逻辑运算符 --> java一致
									假定 A 值为 True，B 值为 False。
									&&	逻辑 AND 运算符。 如果两边的操作数都是 True，则条件 True，否则为 False。	(A && B) 为 False
									||	逻辑 OR 运算符。 如果两边的操作数有一个 True，则条件 True，否则为 False。	(A || B) 为 True
									!	逻辑 NOT 运算符。 如果条件为 True，则逻辑 NOT 条件 False，否则为 True。	!(A && B) 为 True
			位运算符 -->
									假定 A 为60 = 0011 1100，B 为13  = 0000 1101：
									&	按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。	(A & B) 结果为 12, 二进制为 0000 1100
									|	按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或	(A | B) 结果为 61, 二进制为 0011 1101
									^	按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或，当两对应的二进位相异时，结果为1。	(A ^ B) 结果为 49, 二进制为 0011 0001
									<<	左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位，由"<<"右边的数指定移动的位数，高位丢弃，低位补0。	A << 2 结果为 240 ，二进制为 1111 0000
									>>	右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位，">>"右边的数指定移动的位数。		A >> 2 结果为 15 ，二进制为 0000 1111
			赋值运算符 -->
									=	简单的赋值运算符，将一个表达式的值赋给一个左值	C = A + B 将 A + B 表达式结果赋值给 C
									+=	相加后再赋值	C += A 等于 C = C + A
									-=	相减后再赋值	C -= A 等于 C = C - A
									*=	相乘后再赋值	C *= A 等于 C = C * A
									/=	相除后再赋值	C /= A 等于 C = C / A
									%=	求余后再赋值	C %= A 等于 C = C % A
									<<=	左移后赋值	C <<= 2 等于 C = C << 2
									>>=	右移后赋值	C >>= 2 等于 C = C >> 2
									&=	按位与后赋值	C &= 2 等于 C = C & 2
									^=	按位异或后赋值	C ^= 2 等于 C = C ^ 2
									|=	按位或后赋值	C |= 2 等于 C = C | 2
			其他运算符 -->
									&	返回变量存储地址	&a; 将给出变量的实际地址。
									*	指针变量。	*a; 是一个指针变量
	*/

	/**
	条件语句
	*/
	if true {
		fmt2.Print("如果你,追到我,我就让你：")
		if false {
			fmt2.Println("嘿嘿，你找不到我!")
		} else {
			fmt2.Println("嘿嘿嘿")
		}
	}

	/**
	循环语句
	*/
	for n := 1; n <= 9; n++ {
		for m := 1; m <= n; m++ {
			fmt2.Printf("%d*%d=%d ", m, n, m*n)
		}
		fmt2.Println("")
	}
}

func Max(num1, num2 int) int {
	var result int
	if num1 > num2 {
		result = num1
	} else {
		result = num2
	}
	return result
}
